home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
NOVA - For the NeXT Workstation
/
NOVA - For the NeXT Workstation.iso
/
SourceCode
/
AdobeExamples
/
NX_Scroll
/
EpsfParser.m
< prev
next >
Wrap
Text File
|
1992-12-19
|
6KB
|
295 lines
/*
* (a) (C) 1990 by Adobe Systems Incorporated. All rights reserved.
*
* (b) If this Sample Code is distributed as part of the Display PostScript
* System Software Development Kit from Adobe Systems Incorporated,
* then this copy is designated as Development Software and its use is
* subject to the terms of the License Agreement attached to such Kit.
*
* (c) If this Sample Code is distributed independently, then the following
* terms apply:
*
* (d) This file may be freely copied and redistributed as long as:
* 1) Parts (a), (d), (e) and (f) continue to be included in the file,
* 2) If the file has been modified in any way, a notice of such
* modification is conspicuously indicated.
*
* (e) PostScript, Display PostScript, and Adobe are registered trademarks of
* Adobe Systems Incorporated.
*
* (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
* CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
* AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
* ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
* OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
* WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
* WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
* DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
* OF THIRD PARTY RIGHTS.
*/
/*
* EpsfParser.m
*
* This class reads in a distilled epsf file and attempts to parse through the file
* and insert the paths into the programs data structures.
*
* Version: 2.0
* Author: Ken Fromm
* History:
* 03-07-91 Added this comment.
*/
#import "EpsfParser.h"
#import "ScrollApp.h"
#import "iparser.h"
#import <appkit/Panel.h>
#import <appkit/nextstd.h>
#import <stdio.h>
static char *processToLineEnd();
static char *processToField();
static BOOL checkForPS(char **dataptr, float *level_dsc, float *level_epsf)
{
char *dp;
BOOL invalid_ps = YES;
*level_dsc = *level_epsf = 0.0;
dp = *dataptr;
if (!strncmp(dp, "%!PS-Adobe-", 11))
{
invalid_ps = NO;
dp +=11;
sscanf(dp, "%f", level_dsc);
while(*dp == ' ') dp++;
if (!strncmp(dp, "EPSF-", 5))
{
dp += 5;
sscanf(dp, "%f", level_dsc);
}
}
*dataptr = processToLineEnd(dp);
return invalid_ps;
}
static int checkType(char *s0, char *s1, char *s2, char *s3)
{
int type = PS_NOTYPE;
if (s0 && *s0 && s1 && *s1)
{
if (!strncmp(s0, "Adobe", 5) && !strncmp(s1, "Illustrator", 11))
type = PS_ILLUSTRATOR;
else if (!strncmp(s0, "Glenn", 5) &&
!strncmp(s1, "Reid", 4) &&
!strncmp(s3, "still.ps", 8))
type = PS_DISTILLERY;
}
return type;
}
static BOOL validateCreator(int ps_creator)
{
if (ps_creator == PS_DISTILLERY)
return YES;
else
return NO;
}
static void convertBounds(float *aBox, NXRect *aRect)
{
aRect->origin.x = aBox[0];
aRect->origin.y = aBox[1];
aRect->size.width = aBox[2] - aBox[0];
aRect->size.height = aBox[3] - aBox[1];
}
static char *processToLineEnd(char *dp)
{
dp = strchr(dp,'\n'); dp++;
return dp;
}
static char *processToField(char *dp)
{
dp = strchr(dp,':'); dp++;
if (*dp == ' ')
{
strrchr(dp, ' ');
dp++;
}
return dp;
}
static void checkHeader(char **dataptr, float *bbox, BOOL *validBBox, int *creator)
{
BOOL done = NO;
char *dp;
char str0[40], str1[40], str2[40], str3[40];
int matches = 0;
*creator = PS_NOTYPE;
*validBBox = NO;
dp = *dataptr;
while (*dp && !done)
{
if (strncmp(dp, "%%", 2) == 0)
{
dp += 2;
if (strncmp(dp, "EndComments", 11) == 0)
done = YES;
else if (strncmp(dp, "Creator:", 8) == 0)
{
dp = processToField(dp);
sscanf(dp, "%s%s%s%s", str0, str1, str2, str3);
*creator = checkType(str0, str1, str2, str3);
}
else if (strncmp(dp, "BoundingBox:", 12) == 0)
{
dp = processToField(dp);
if (strncmp(dp, "(atend)", 7) != 0)
{
matches = sscanf(dp, "%f %f %f %f",
&bbox[0], &bbox[1], &bbox[2], &bbox[3]);
if ((matches && matches != 4) ||
(matches == 4 &&
(bbox[2] == bbox[0] || bbox[3] == bbox[1])))
*validBBox = YES;
}
}
}
dp = processToLineEnd(dp);
}
*dataptr = dp;
return;
}
static void checkTrailer(char **dataptr, float *bbox, BOOL *validBBox)
{
BOOL done = NO;
char *dp;
int matches = 0;
*validBBox = NO;
dp = *dataptr;
while (*dp && !done)
{
if (strncmp(dp, "%%", 2) == 0)
{
dp += 2;
if (strncmp(dp, "BoundingBox:", 12) == 0)
{
dp = processToField(dp);
matches = sscanf(dp, "%f %f %f %f",
&bbox[0], &bbox[1], &bbox[2], &bbox[3]);
if (matches == 4 && bbox[2] != bbox[0] && bbox[3] != bbox[1])
{
done = YES;
*validBBox = YES;
}
}
}
dp = processToLineEnd(dp);
}
*dataptr = dp;
return;
}
@implementation EpsfParser
/*
* Checks for valid PS file, gets the bounding box and checks for
* the creator. The creator will let us determine whether we can read
* the file into our own graphics structure.
*/
- readPSFromStream:(NXStream *)stream
{
id graphic;
BOOL error = YES, validBBox = NO;
char *data;
float bbox[4];
int length, /* the number of bytes in data */
maxlen; /* size of vm_allocated region */
bbox[0] = bbox[1] = bbox[2] = bbox[3] = 0;
NXGetMemoryBuffer(stream, &data, &length, &maxlen);
if (length)
{
error = checkForPS(&data, &level_dsc, &level_epsf);
if (!error)
{
error = YES;
checkHeader(&data, bbox, &validBBox, &creator);
if (validateCreator(creator))
{
if (!iparse(&data))
{
if (!validBBox)
checkTrailer(&data, bbox, &validBBox);
if (validBBox)
{
convertBounds(bbox, &bounds);
error = NO;
}
else
NXRunAlertPanel("Load File",
"Invalid bounding box. Cannot open.",
"OK", NULL, NULL);
}
}
else
NXRunAlertPanel("Load File",
"Not a distilled file. Cannot open.",
"OK", NULL, NULL);
}
else
NXRunAlertPanel("Load File", "Not a valid PS file. Cannot open.",
"OK", NULL, NULL);
}
else
NXRunAlertPanel("Load File", "Invalid file. Cannot open.",
"OK", NULL, NULL);
if (error)
return nil;
else
return self;
}
- getBounds:(NXRect *) aRect
{
*aRect = bounds;
}
@end